package com.google.code.lf.gfm;

import java.io.File;

import com.google.code.lf.gfm.model.grisbi.GrisbiFile;
import com.google.code.lf.gfm.model.rules.GrisbiAfterFileImportParamFile;

/**
 * Interface du manager de l'application. Expose les principaux services.
 * 
 * @author gael.lorent-fonfrede
 */
public interface IGrisbiFileManager {
	/** Id de bean Spring : grisbiFileManager. */
	public static final String BEAN_ID = "grisbiFileManager";

	/** Identifiant de paramètre: paramFilePath. */
	public final static String pParam = "-p";
	/** Identifiant de paramètre: accountFilePath. */
	public final static String aParam = "-a";
	/** Identifiant de paramètre: paramFileName. */
	public final static String pfnParam = "-pfn";
	/** Identifiant de paramètre: accountFileName. */
	public final static String afnParam = "-afn";

	/**
	 * Lecture du fichier de paramétrage et initialisation du modèle objet correspondant.
	 * 
	 * @param paramFile La référence de {@link File} à charger.
	 * @return Le {@link GrisbiAfterFileImportParamFile} initialisé.
	 */
	public GrisbiAfterFileImportParamFile loadParamFile(File paramFile);

	/**
	 * Enregistrement du fichier de paramétrage.
	 * 
	 * @param grisbiAfterFileImportParamFile Le {@link GrisbiAfterFileImportParamFile} à écrire.
	 * @param targetFiletoWrite La référence de {@link File} cible à utiliser pour l'écriture.
	 * 
	 * @see #loadParamFile(File)
	 */
	public void saveParamFile(GrisbiAfterFileImportParamFile grisbiAfterFileImportParamFile, File targetFiletoWrite);

	/**
	 * Lecture du fichier de comptes et initialisation du modèle objet correspondant.
	 * 
	 * @param accountFile La référence de {@link File} à charger.
	 * @return Le {@link GrisbiFile} initialisé.
	 */
	public GrisbiFile loadAccountFile(File accountFile);

	/**
	 * Exécution des règles sur le fichier de comptes.
	 * 
	 * @param grisbiAfterFileImportParamFile Le {@link GrisbiAfterFileImportParamFile} utilisé pour paramétrer les règles.
	 * @param grisbiFile Le {@link GrisbiFile} à traiter.
	 * @return Le {@link GrisbiFile} modifié.
	 * 
	 * @see #loadParamFile(File)
	 * @see #loadAccountFile(File)
	 */
	public GrisbiFile processRules(GrisbiAfterFileImportParamFile grisbiAfterFileImportParamFile, GrisbiFile grisbiFile);

	/**
	 * Sauvegarde du fichier de comptes d'origine.
	 * 
	 * @param originalFile La référence de {@link File} du fichier à sauvegarder.
	 * @param backupFile La référence de {@link File} à utiliser pour la sauvegarde. Facultatif, peut-être <code>null</code>. Auquel cas le fichier de sauvegarde est généré à côté du fichier d'origine avec un nom suffixé automatiquement.
	 * @return La référence de {@link File} de la sauvegarde générée.
	 */
	public File backup(File originalFile, File backupFile);

	/**
	 * Ecriture physique du fichier de comptes.
	 * 
	 * @param grisbiFile Le {@link GrisbiFile} à écrire.
	 * @param targetFiletoWrite La référence de {@link File} cible à utiliser pour l'écriture.
	 * 
	 * @see #processRules(GrisbiAfterFileImportParamFile, GrisbiFile)
	 */
	public void validate(GrisbiFile grisbiFile, final File targetFiletoWrite);
}